package Form;

import java.util.ArrayList;
import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;

import Creche.Admin.Administrateur;
import Creche.Bd.BD;

public final class ConnexionForm {
	
	private static final String CHAMP_EMAIL = "email";
	private static final String CHAMP_NOM = "identifiant";
    private static final String CHAMP_PASS = "motdepasse";
    
    private String resultat;
    private boolean inscrit;
    private HashMap<String,String> erreurs = new HashMap<String,String>();
    
    /**
     * @return le resultat du formulaire
     */
    public String getResultat() {
        return resultat;
    }
    
    
    /**
     * @return vrai si un administrateur est déjà inscrit
     */
    public boolean getInscrit() {
    	return inscrit;
    }
    
    
    /**
     * @return la map des erreurs saisis dans le formulaire
     */
    public HashMap<String,String> getErreurs() {
        return erreurs;
    }
    
    
    /**
     * Crée un administrateur après validation du formulaire 
     * @param requette de la servlet
     * @return administrateur
     */
    public Administrateur connecterAdmin(HttpServletRequest req) {
    	
    	String email = req.getParameter(CHAMP_EMAIL).trim();
    	String identifiant = req.getParameter(CHAMP_NOM).trim();
        String motDePasse = req.getParameter(CHAMP_PASS).trim();
     
        Administrateur admin = new Administrateur("key");
        
        /* Validation du champ email */
        try {
            validationEmail(email);
            admin.setEmail(email);
        } catch (Exception e) {
            setErreur(CHAMP_EMAIL, e.getMessage());
        }
        
        
        /* Validation du champ identifiant */
        try {
            validationIdentifiant(identifiant);
            admin.setIdentifiant(identifiant);
        } catch (Exception e) {
            setErreur(CHAMP_NOM, e.getMessage());
        }
        
        
        /* Validation du champ mot de passe */
        try {
            validationMotDePasse(motDePasse);
            admin.setMotDePasse(motDePasse);
        } catch (Exception e) {
            setErreur(CHAMP_PASS, e.getMessage());
        }
        
        BD myBD = new BD();
        ArrayList<Object> al = myBD.canConnectAdmin(admin);
        inscrit = (Boolean) al.get(0);
        
        /* Initialisation du résultat global de la validation */
        if (erreurs.isEmpty() && inscrit) {
        	admin = (Administrateur) al.get(1);
        } else {
            resultat = "Echec de la connexion";
        }
     
        return admin;
    }
    
    
    /**
     * Crée un message d'erreur si email invalide ou non saisi
     * @param email saisi par l'utilisateur
     */
    private void validationEmail(String email) throws Exception {
        if (!email.isEmpty()) {
            if (!email.matches( "([^.@]+)(\\.[^.@]+)*@([^.@]+\\.)+([^.@]+)" )) {
                throw new Exception("Adresse email invalide");
            }
        } 
        else {
            throw new Exception("Veuillez saisir une adresse email");
        }
    }
    
    
    /**
     * Crée un message d'erreur si le nom contient moins de 4 caractères
     * ou si il n'a pas été saisi
     * @param identifiant saisi par l'utilisateur 
     */
    private void validationIdentifiant(String nom) throws Exception {
        if (!nom.isEmpty()) {
        	if (nom.length() < 4) {
        		throw new Exception("Le nom doit contenir au moins 4 caractères");
        	}
        }
        else {
            throw new Exception("Veuillez saisir un identifiant");
        }
    }
    
    
    /**
     * Crée un message d'erreur si le mdp contient moins de 4 caractères ou
     * si le mot de passe n'est pas saisi
     * @param mot de passe saisi par l'utilisateur
     */
    private void validationMotDePasse(String motDePasse) 
    		throws Exception {
    	if (!motDePasse.isEmpty()) {
            if (motDePasse.length() < 4) {
                throw new Exception("Le mdp doit contenir au moins 4 caractères");
            }
        }
    	else {
    		throw new Exception("Veuillez saisir votre mot de passe");
    	}
    }
    
    
    /**
     * Ajoute dans la map des erreurs le message correspondant au champ
     * @param champ du formulaire
     * @param message d'erreurs
     */
    private void setErreur(String champ, String message) {
        erreurs.put(champ, message);
    }
}
